package 匿名内部类;

/*
 *
 * 如果接口的实现类，或者父类的子类只需要使用唯一的一次，
 * 那么，可以省略该类的定义，改为使用匿名内部类
 *
 * 匿名内部类的格式：
 *   接口名称 对象名=new 接口名称(){
 *   //覆盖重写所以抽象放啊
 *   };
 *
 *匿名内部类的注意事项：
 *  1、格式的解析
 *         接口名称 对象名=new 接口名称(){...};
 *       (1)new是创建对象的动作
 *       (2)接口名称是匿名内部类所需要实现的接口的名称
 *       (3){...}是匿名内部类的内容
 *  2、匿名内部类在创建对象时，只能使用一次，如果希望多次创建对象，并且类的内容一致时，就必须单独定义实现类
 *  3、因为匿名对象无法调用第二次，所以想再次使用时，必须再次创建一个内部类的匿名对象
 *  4、匿名内部类是省略了【实现类、子类的名称】，但是匿名对象省略了【对象名称】
 *  5、匿名对象和匿名内部类不同
 * */
public class Test01 {
    public static void main(String[] args) {

        // MyInterfaceImp one = new MyInterfaceImp();
        // one.method();
        // //左父右子，多态的写法
        // MyInterface two = new MyInterfaceImp();
        // two.method();

        //匿名内部类可以无需创建实现类
        MyInterface one = new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名内部类实现了抽象方法的覆盖重写111-one");

            }

            @Override
            public void method2() {
                System.out.println("匿名内部类实现了抽象方法的覆盖重写222-one");

            }

        };
        one.method1();
        one.method2();
        //使用匿名内部类，并且省略了对象名称，也是匿名对象
        new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名内部类实现了抽象方法的覆盖重写111-two");

            }

            @Override
            public void method2() {
                System.out.println("匿名内部类实现了抽象方法的覆盖重写222-two");
            }

        }.method1();


        new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名内部类实现了抽象方法的覆盖重写111-two");

            }

            @Override
            public void method2() {
                System.out.println("匿名内部类实现了抽象方法的覆盖重写222-two");
            }

        }.method2();

    }
}
